Попередня сторінка: Графічні методи модуля tkinter
Наступна сторінка: Поштові служби інтернету
В усіх програмах із використанням графіки ми часто бачимо ефекти анімації . Анімація — це ілюзія руху об’єктів, яка досягається шляхом швидкої зміни зображень на екрані .
Кожна із зображених на полотні фігур (див . § 10) є окремим об’єктом, і завдяки цьому можна програмувати їх рух і взаємодію.
Рух графічних об'єктів
Розглянемо методи, що знадобляться для переміщення об’єкта полотном .
• Метод canvas.move переміщає графічний об’єкт, змінюючи значення його координат на задані величини: canvas.move(item, x, y),
де item — ідентифікатор графічного об’єкта (створюється автоматично під час створення графічного об’єкта); x, у — значення зміщення по горизонталі та вертикалі (у пікселях) .
• Метод update() примусово оновлює зображення.
• Метод time.sleep() затримує виконання програми: time.sleep(t),
де t - величина затримки (в секундах) .
Організуємо горизонтальний рух круга по полотну. Перший створений об’єкт (круг) автоматично отримує ідентифікатор 1:
Блок коду в циклі for призначено для пересування круга по полотну. Зокрема, команда canvas.move(1, 5, 0) пересуне об’єкт із ідентифікатором 1 (це і є круг) на 5 пікселів праворуч і 0 пікселів по вертикалі .
Для пересування ліворуч знадобилася б команда canvas.move(1, -5, 0) . Для руху по діагоналі слід змінювати одночасно координати х і у: canvas.move(1, 5, 5)
Програмування реакції об’єктів на події
Можна зробити так, щоб об’єкт рухався у відповідь на подію, що відбувається під час роботи програми — пересування миші, натискання зазначеної клавіші . Для обробки події потрібно описати функцію, а потім повідомити tkinter, що ця функція має викликатися кожного разу, коли відбудеться зазначена подія Для встановлення зв’язку між подією та її обробником існує метод bind_all():
Функція має єдиний аргумент event, через який передається інформація про подію . Об’єкт event має властивість keysym, яка набуває значення відповідної клавіші . Якщо натиснуто клавішу «^-», це означає, що відбулася подія <KeyPress-Right>', і властивість event.keysym отримує значення 'Right' (рис . 11.1) .
Буде цікавіше змінювати напрямок руху круга, застосовуючи всі чотири клавіші зі стрілками. В тілі функції move_oval() запрограмуємо зміну координат об’єкта залежно від того, яке значення передане для аргумента event:
У функції move_oval() перевіряється, чи містить змінна keysym значення 'Up'. Якщо так, викликається метод canvas.move(1, 0, -3), і круг зміщується вгору. Якщо ні, перевіряється, чи містить змінна keysym значення 'Down', і, якщо так, робиться крок униз. Так само опрацьовується значення 'Left'. Якщо жодна з трьох умов не виконалася, круг зміщується праворуч . Таким чином, при натисканні на клавішу об’єкт пересувається в заданому напрямку
Далі повідомимо tkinter, що функцію move_oval() треба застосовувати для обробки чотирьох подій: натискань клавіш «вгору», «вниз», «ліворуч» і «праворуч»:
Створення анімації з використанням графічних файлів
У мультфільмах ілюзія руху об’єктів створюється за рахунок послідовної зміни кадрів, кожний із яких фіксує чергову фазу руху об’єкта
Використовуючи цей принцип, ми можемо запрограмувати рух об’єктів на полотні . Спочатку потрібно підготувати певну кількість графічних файлів, які містять зображення фаз руху деякого об’єкта Потім запрограмувати послідовне завантаження на полотно зображень із цих файлів . Між завантаженнями слід затримати виконання програми для того, щоб користувач встиг побачити чергове зображення .
Створимо анімацію Політ метелика із трьох кадрів . Розглянемо кроки створення анімації.
1 . Підготуємо три графічних файли з зображеннями фаз руху метелика (рис . 11.2) . Імена цих файлів зберігатимуться у списку anim (див . програму) .
2 . Запишемо програмний код:
Проаналізуємо опис функції play(), що призначена для організації зміни зображень . В циклі for почергово викликом методу create_image створюється зображення на основі графічних даних чергового кадра зі списку frames .
Метод time.sleep(0.1) виконує затримку зображення на 0.1 секунди . Метод root.after викликається для об’єкта root з аргументами: 0 мс; play, тобто зразу ж після завершення функція play() буде викликана повторно, і зміна зображень продовжиться .
3 . Зберігаємо файл з програмним кодом і виконуємо програму. Отже, засоби бібліотеки tkinter дозволяють створювати програми з анімаційними ефектами, а також додавати реакцію на дії користувача шляхом програмування обробки подій .
Питання для самоперевірки
1. Які функції використовуються для переміщення об’єкта по полотну?
2. Як запрограмувати реакцію об’єкта на подію?
3. Поясніть призначення параметрів функції:
4. Опишіть кроки створення анімації шляхом послідовної зміни зображень
5. Як зміниться Політ метелика (див . приклад 4), якщо з коду вилучити виклик методу time.sleep(0.1)?
6. Створіть програму, в якій по зоряному небу рухається космічний зонд Кассіні (рис. 11.3) .
Вправа її
Створити програму, в якій реалізовано рух кульки по полотну. Об’єкт має змінювати положення у відповідь на натискання клавіш управління курсором, залишаючи слід на полотні (рис . 11.4) .
2) Намалюйте у лівому верхньому куті червоний круг. Ідентифікатор створеного круга зберігатиметься в змінній ball: ball = canvas.create_oval(10, 10, 30, 30, fill = 'red') Слід кульки утворюватимуть відрізки, що сполучають центри послідовних положень круга
3) Для обчислення координат центра круга (рис . 11.5) опишіть функцію midpoint:
4) Опишіть функцію move_oval() . У ній будуть змінюватися координати круга залежно від того, яку клавішу натиснуто (параметр event), а також малюватиметься відрізок між центрами круга в початковому і кінцевому положеннях:
5) Запишіть виклики функції canvas.bind_all для встановлення зв’язку між подіями «натискання на клавішу зі стрілкою і функцією move_oval:
Збережіть файл з іменем Vprava11 і випробуйте програму.
6) Удоскональте програму: змініть товщину і колір сліду, який залишає круг; додайте діагональні переміщення за допомогою клавіш A, S, Z, X .
Комп’ютерне тестування
Виконайте тестове завдання 11 із автоматичною перевіркою результату
§ 12.
Об'єктно-орієнтоване програмування
Як ви знаєте, мова Python є об’єктно-орієнтованою, тобто кожна величина є об’єктом певного класу. Добре спроектовані об’єкти — це «будівельні блоки», з яких легше будувати складні програми .
Опис класів та створення об'єктів
У 6 класі ви дізналися, як створити свій власний клас (тип) об’єктів . Опис класу розташовується на початку коду програми . Синтаксис опису класу:
Метод__init__називається конструктором класу. Він автоматично
виконується під час створення кожного нового екземпляра на основі даного класу. Ім’я методу починається й закінчується двома символами підкреслення . У списку атрибутів (властивостей) класу першим має бути параметр self, він потрібен для зв’язку з конкретним об’єктом .
Можна вважати, що клас — це своєрідна інструкція зі створення екземплярів . Створення об’єкта на основі класу називають створенням екземпляра класу
Синтаксис команди створення об’єкта такий:
змінна = Ім'я_класу(перелік значень атрибутів)
Далі в програмі з’являється об’єкт, доступ до якого можна отримати за іменем змінної. Об’єкт отримує атрибути його класу.
Атрибути класу — це імена змінних, у яких зберігаються значення властивостей об’єктів
Опишемо клас Balloons, який представляє повітряні кульки . Створимо об’єкт balloon — червону кульку висотою 10 см (рис . 12.1) .
Значення атрибутів об’єкта можна вивести на екран: print (balloon.inflated)
Можна змінити значення атрибута: balloon.color = 'green'
Значення атрибута можна присвоювати змінним: mycolor = balloon.color
Опишемо клас Ball, який представляє кола заданого радіуса, кольору і розташування на полотні . Створимо два екземпляри класу:
Створимо список із 10 об’єктів класу Ball із випадковими координатами і кольорами, що вибираються зі списку colors (рис . 12 . 2) .
Методи класу
Методи — це дії, які можуть виконувати об’єкти даного класу. Методи можуть змінювати властивості (значення атрибутів) об’єкта, виконувати інші дії над об’єктами . Змінюючи атрибути, пов’язані з екземпляром класу, ми можемо змінювати стан об’єктів у програмі .
Синтаксис заголовка методу класу:
def ім'я_методу^еії):
Замість параметра self у разі виклику методу підставляється ім’я конкретного об’єкта
Від звичайної функції метод класу відрізняється наявністю параметра self, опис методу класу розташовується в описі класу.
Виклик методу для конкретного об’єкта в основному блоці програми має вигляд: об'єкт.ім'я_методу(...) .
У разі виклику методу класу до нього автоматично передається змінна екземпляра — інформація про об’єкт, який викликає метод
Додамо до опису класу Balloons метод boom(), який виконується, якщо кулька лопнула (рис . 12.3) .
Принципи об’єктно-орієнтованого програмування
Поняття класу та об’єкта є основою об’єктно-орієнтованого програмування (ООП) . Програма створюється як деяка сукупність об’єктів, які взаємодіють між собою. ООП базується на трьох основних принципах: інкапсуляція, успадкування та поліморфізм Розглянемо сутність цих принципів .
Ви вже знаєте, що списки дозволяють об’єднувати дані, а для об’єднання фрагментів коду в окремий блок застосовуються функції. Об’єкти ж дозволяють об’єднувати функції (методи класу) і дані (значення атрибутів) (рис . 12.4) .
Інкапсуляція — це об’єднання в межах класу певних даних і методів для роботи з ними. Наприклад, ми описали клас Balloons, що представляє повітряні кульки і містить дані про кульку (колір, висота, «надутість»), і методи (змінити значення атрибутів в разі проколювання кульки, збільшити розміри кульки тощо) . При цьому клас стає новим типом даних у програмі, і ми можемо створювати об’єкти — змінні цього нового типу.
Успадкування — це можливість створення нового класу (нащадка) на базі наявного (базового)
Розглянемо такі поняття, як «людина», «учень» . Будь-яка людина має ім’я, прізвище, вік, інші загальні характеристики. Учень також має ім’я, прізвище, вік, але, крім цього, він має додаткові характеристики: навчальний заклад, клас .
З точки зору наслідування клас Учень є нащадком класу Людина . Таким чином, клас-нащадок містить ті самі атрибути й методи, що й базовий клас . Але при цьому його можна розширити через додавання нових методів і атрибутів . Це позбавляє необхідності починати створення класу-нащадка «з нуля» — описувати атрибути й методи, успадковані від базового класу
На основі базового класу Animal (тварина) створимо два класи-на-щадки: Dog (собака) і Cat (кіт), які мають власні методи .
Поліморфізм — це різна поведінка методу в різних класах. Методи з однаковим іменем, описані в різних класах, можуть виконувати різні дії.
Опишемо класи Triangle (прямокутний трикутник) і Square (квадрат) . Додати до описів класів метод для обчислення площі фігури .
Додамо метод voice (голос) до класів Dog і Cat (див . приклад 5) .
Питання для самоперевірки
1. У чому різниця між класом і його екземпляром?
2. Якими атрибутами ви б описали об’єкт Автомобіль, якщо моделюється: а) робота автосалону; б) автоперегони?
3. Проаналізуйте фрагмент програмного коду. Які принципи ООП використано під час складання цього коду?
4. Опишіть клас Car(), що містить атрибути кількість пального в баку на даний момент, пройдений шлях. Додайте до опису класу Car() метод для зміни значення пробігу
Вправа 12
Запрограмувати рух об’єктів класу Ball (М'яч) по вертикалі з відбиттям від меж вікна
У Python IDLE виберіть команду File ^ New File.
1) Імпортуйте необхідні модулі: from tkinter import*
from random import* from time import*
2) Створіть вікно програми і додайте полотно розміром 500 х 400.
3) Створіть клас Ball() з атрибутами x, у (координати правого верхнього кута квадрата, в який уписано круг) і color (колір кульки) .
4) Додайте до опису класу Ball метод, який буде перевіряти, чи дійшов об’єкт до межі вікна, і змінювати напрямок руху.
5) Створіть список із 10 об’єктів класу Ball із випадковими координатами:
6) У нескінченному циклі організуйте виклик методу ruh() для кожного елемента списку list_ball і виклик методу canvas.move() із новими координатами
Збережіть програмний код у файлі з іменем Vprava12 і виконайте програму. Поекспериментуйте зі значеннями величин зміни координати y, радіуса круга
Комп’ютерне тестування
Виконайте тестове завдання 12 із автоматичною перевіркою результату
Практична робота з
Моделювання руху об'єктів
Завдання: скласти ігрову програму Ловець бульбашок . На ігровому полотні кожні 0,2 с виникають бульбашки (див . рисунок) . Гравець знищує бульбашки, клацаючи їх . Якщо кількість бульбашок у вікні перевищує 30, гра припиняється .
Обладнання: комп’ютер зі встановленим середовищем програмування Python .
Хід роботи
Під час роботи з комп’ютером дотримуйтеся правил безпеки.
У Python IDLE виберіть команду File ^ New File .
1. Завантажте модулі, потрібні для реалізації руху об’єктів . Створіть вікно програми і додайте полотно розміром 800 х 500:
2. Створіть глобальну змінну num — лічильник «упійманих» бульбашок:
num = 0
3. Створіть клас Bub() з атрибутами id (автоматично створюваний ідентифікатор об’єкта), r (радіус бульбашки), dx, dy (величини зміщень за осями під час руху)
4. Створіть порожній список об’єктів класу Ball(): my_bub = list[]
5. Опишіть функцію create_bubble(), в тілі якої випадково задаються координати й радіус бульбашки . Ідентифікатор створеного кола зберігається в змінній id1.
Змінні dx, dy отримують випадкові значення з проміжку [-2; 1], що задає напрямок хаотичного руху бульбашки . Додайте об’єкт id1 до списку my_bub
6. Опишіть функцію move_bubble(): кожен об’єкт зі списку my_bub змінює координати на свої значення dx, dy:
•7. Опишіть функцію get_coords(id_num), у якій визначаються координати центра круга (див . рис . 11.5):
8. Опишіть функцію clean_up_bubs(), у якій для кожного елемента списку перевіряється, чи не виходить він за межі вікна. Якщо виходить, відбувається зміна знака dx і/або dy:
9. Опишіть функцію click(event) для обробки події клацання об’єкта . Коли відбувається ця подія, бульбашка вилучається з вікна, і об’єкт із відповідним ідентифікатором вилучається зі списку. Значення лічильника num збільшується на 1 і виводиться у заголовок вікна
10. Після описів усіх функцій в основній програмі запишіть виклик методу canvas.bind() для встановлення зв’язку між подією клацання об’єкта та функцією click:
11. Організуйте перегляд всього списку і виклик методів move_ bubbles(), clean_up_bubs() для кожного елемента списку, поки довжина списку об’єктів не досягне 30.
12. Змініть періодичність виникнення кульок .
Додайте до кульок заливку.
Збережіть програмний код у файлі з іменем ПрактичнаЗ і випробуйте програму
Зробіть висновок: чому для моделювання руху графічних об’єктів доречно використовувати методи ООП.
Це матеріал з підручника Інформатика за 7 клас Бондаренко
Наступна сторінка: Поштові служби інтернету